package org.idtem.component.algoritmo.engine;

import java.util.ArrayList;
import java.util.Collection;

import org.apache.uima.cas.FSIterator;
import org.apache.uima.jcas.JCas;
import org.idtem.component.algoritmo.SentenciaCompletitud;
import org.idtem.component.algoritmo.engine.utilidades.UtilidadesDeAnalisis;
import org.idtem.component.common.FreelingConsulta;
import org.idtem.component.freeling.Sentencia;
import org.idtem.component.identificador.DataRelacion;
import org.idtem.component.identificador.DataRelacionRecursiva;
import org.idtem.utils.constants.Constants;


public class AlgoritmoCompletitud{

	public static void analizar(JCas cas) {
		//Analiza cada sentencia valorando estas segun la completitud de estas con respecto a la consulta del usuario.
		
		Collection<Sentencia> sentencias = UtilidadesDeAnalisis.getSentencias(cas);
				
		for (Sentencia sentencia : sentencias) // para cada sentencia
		{
			SentenciaCompletitud sentenciaCompletitud =  new SentenciaCompletitud(cas);
			sentenciaCompletitud.setPonderacionRelaciones(0);
			
			ArrayList<FreelingConsulta> tokensFraseEncontrados = new ArrayList<FreelingConsulta>();
			FSIterator it = UtilidadesDeAnalisis.getRelationIterator(cas);
			boolean salir = false;
			while (it.hasNext() && !salir)
			{			
				DataRelacion relation = (DataRelacion)it.next();
				if (relation.getBegin() > sentencia.getEnd())
					salir = true;
				if (relation.getBegin() >= sentencia.getBegin() && relation.getEnd() <= sentencia.getEnd()){ // relacion pertenece a la consulta
					addFreelingConsulta(tokensFraseEncontrados, relation.getFreeling2_consulta());
					
					int valor = sentenciaCompletitud.getPonderacionRelaciones();
					
					double ponderacionPorProfundidad = Constants.AlgoritmosConstants.PONDERACION_PROFUNDIDAD_DEFECTO;
					if (relation instanceof DataRelacionRecursiva){
						ponderacionPorProfundidad = UtilidadesDeAnalisis.getPonderacionPorProfundidad(((DataRelacionRecursiva)relation).getProfundidad());
					}
					sentenciaCompletitud.setPonderacionRelaciones(valor + (new Double(UtilidadesDeAnalisis.getRelationWeight(relation)*ponderacionPorProfundidad)).intValue());					
				}
			}

			sentenciaCompletitud.setBegin(sentencia.getBegin());
			sentenciaCompletitud.setEnd(sentencia.getEnd());
			sentenciaCompletitud.setSentencia(sentencia);
			sentenciaCompletitud.setCantNombres(UtilidadesDeAnalisis.SentenciaUtils.cantNombresSentencia(sentencia, false, cas));
			sentenciaCompletitud.setCantNombresConOffset(UtilidadesDeAnalisis.SentenciaUtils.cantNombresSentencia(sentencia, true, cas));
			sentenciaCompletitud.setCantAdjetivos(UtilidadesDeAnalisis.SentenciaUtils.cantAdjetivosSentencia(sentencia, false, cas));
			sentenciaCompletitud.setCantAdjetivosConOffset(UtilidadesDeAnalisis.SentenciaUtils.cantAdjetivosSentencia(sentencia, true, cas));
			sentenciaCompletitud.setCantVerbos(UtilidadesDeAnalisis.SentenciaUtils.cantVerbosSentencia(sentencia, false, cas));
			sentenciaCompletitud.setCantVerbosConOffset(UtilidadesDeAnalisis.SentenciaUtils.cantVerbosSentencia(sentencia, true, cas));
			sentenciaCompletitud.setCantAdverbios(UtilidadesDeAnalisis.SentenciaUtils.cantAdverbiosSentencia(sentencia, false, cas));
			sentenciaCompletitud.setCantAdverbiosConOffset(UtilidadesDeAnalisis.SentenciaUtils.cantAdverbiosSentencia(sentencia, true, cas));
			sentenciaCompletitud.setCantPalabras(UtilidadesDeAnalisis.SentenciaUtils.cantPalabrasSentencia(sentencia, false, cas));
			sentenciaCompletitud.setCantOffsets(UtilidadesDeAnalisis.SentenciaUtils.cantOffsetsSentencia(sentencia, cas));
			sentenciaCompletitud.setTokensFraseEncontrados(tokensFraseEncontrados.size());
			
	
			sentenciaCompletitud.addToIndexes();
		}
	}

	private static void addFreelingConsulta(ArrayList<FreelingConsulta> annotations, FreelingConsulta freelingConsulta) {
		int begin = freelingConsulta.getBegin();
		for (FreelingConsulta freelingConsulta2 : annotations) {
			if (freelingConsulta2.getBegin() == begin)
				return;
		}
		annotations.add(freelingConsulta);		
	}


}
